package main

import (
	"fmt"
	"math"
	"math/cmplx"
)

// 函数外面的变量定义不能使用:= 必须定义关键字
// 函数外的变量是包内部变量不是全局变量
var aa = 3
var ss = "kkk"
var (
	bb = 1
	cc = "ccc"
	kk = false
)

const file = "123.txt"

const (
	file1 = "123"
	file2 = "1234"
)

// 函数中定义的变量作用域在函数的内部, 函数内部的变量定义可以使用 :=

func variableZeroValue() {
	var a int // 变量名在类型前
	var s string
	fmt.Println(a, s)            // Println只能跟变量的名字
	fmt.Printf("%d, %q\n", a, s) // Printf 跟变量的格式
}

func variableInitialValue() {
	var a, b int = 3, 4 // 可以定义多个变量并赋初值
	var s string = "abc"
	fmt.Println(a, b, s)
}

func variableTypeDeduction() {
	var a, b, c, s = 3, 4, true, "def" // 推断变量类型
	fmt.Println(a, b, c, s)
}

func variableShorter() {
	a, b, c, s := 3, 4, true, "def" // 第一次定义变量必须使用:= 来定义
	b = 5                           // 后续的变量赋值可以直接使用 =
	fmt.Println(a, b, c, s)
}

func euler() {
	//c := 3 + 4i
	//fmt.Println(cmplx.Abs(c))
	// 欧拉公式验证
	fmt.Printf("%.3f\n",
		cmplx.Exp(1i*math.Pi)+1) // e的幂指数写法
	//cmplx.Pow(math.E, 1i * math.Pi) + 1)
}
func triangle() {
	var a, b int = 3, 4

	fmt.Println(calcTriangle(a, b))
}

func calcTriangle(a, b int) int {
	var c int                              // c为整形的
	c = int(math.Sqrt(float64(a*a + b*b))) // 类型转换是强制的， Sqrt必须接受float类型
	return c
}

func consts() {
	const filename = "abc.txt"
	const a, b = 3, 4
	var c int
	c = int(math.Sqrt(a*a + b*b)) // 此处无需将a,b转换为float即可直接使用
	fmt.Println(filename, c)
}

func test() {
	var a float64 = 1.99999
	var b int = int(a)
	fmt.Println(b)
}

func enum() {
	const (
		cpp = iota
		java
		python
		golang
	) // go的枚举类型,直接赋值(普通枚举类型)或自增值

	// iota作为自增值表达式的种子来定义枚举类型
	const (
		b = 1 << (10 * iota)
		kb
		mb
		gb
		tb
		pb
	)
	fmt.Println(b, kb, mb, gb, tb, pb)
	fmt.Println(cpp, java, python, golang)
}

func main() {
	//fmt.Println("hello world")
	//variableZeroValue()
	//variableInitialValue()
	//variableTypeDeduction()
	//variableShorter()
	//fmt.Println(aa, ss, bb, cc, kk)
	//euler()
	//triangle()
	//test()
	//consts()
	//fmt.Println(file)
	enum()
}
